﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EGym.BL.Exceptions;
using EGym.Data;

namespace EGym.BL.DataGestor
{
    public class EnderecoGestor : BaseGestor
    {
        #region Propriedades
        public IEnumerable<BussinessLayerEntryException> BussinessLayerEntryExceptions { get; private set; }
        #endregion

        #region Construtores

        public EnderecoGestor(DBDataContext db)
        {
            BussinessLayerEntryExceptions = new List<BussinessLayerEntryException>();
            DB = db;
        }

        #endregion

        #region Metodos

        #region Publicos

        public Endereco GetEnderecoById(int afiliadoId, 
                                        int id)
        {
            var endereco = (from reg in DB.Enderecos
                            where reg.AfiliadoId.Equals(afiliadoId) && 
                                  reg.EnderecoId.Equals(id)
                            select reg
                           ).FirstOrDefault();
            return endereco;
        }
        
        public EnderecoTipo GetTipoDeEnderecoByNome(string nome)
        {
            var enderecoTipo = (from reg in DB.EnderecoTipos
                                where reg.Nome.ToLower().Equals(nome.ToLower())
                                select reg
                               ).FirstOrDefault();
            return enderecoTipo;
        }

        public Estado GetEstadoByNome(string nome)
        {
            var estado = (from reg in DB.Estados
                                where reg.Nome.ToLower().Equals(nome.ToLower())
                                select reg
                               ).FirstOrDefault();
            return estado;
        }

        public void AdcionarEnderecoAssociadoComAfiliacaoAssociada(int afiliadoId, Endereco endereco)
        {
            if (endereco.EnderecoId.Equals(0))
            {
                AplicaValoresAutomaticosParaInsercao(afiliadoId, endereco);
                AfiliadoEndereco afiliadoEndereco = new AfiliadoEndereco();
                afiliadoEndereco.AfiliadoId = afiliadoId;
                afiliadoEndereco.Endereco = endereco;
                endereco.AfiliadoEndereco = afiliadoEndereco;
                DB.Enderecos.InsertOnSubmit(endereco);
            }

            AplicaTratamentoACampoOpcionais(endereco);

            DB.SubmitChanges();
        }

        #endregion

        #region Privados

        private void AplicaTratamentoACampoOpcionais(Endereco endereco)
        {
            if (string.IsNullOrEmpty(endereco.Complemento))
                endereco.Complemento = string.Empty;
        }

        private void AplicaValoresAutomaticosParaInsercao(int afiliadoId, Endereco endereco)
        {
            endereco.AfiliadoId = afiliadoId;
            endereco.EnderecoId = NextId(afiliadoId);
        }

        private int NextId(int afiliadoId)
        {
            var afiliado = (from reg in DB.Enderecos
                            orderby reg.EnderecoId descending
                            where reg.AfiliadoId.Equals(afiliadoId)
                            select reg).FirstOrDefault();
            int retorno = afiliado != null ? afiliado.EnderecoId + 1 : 1;
            return retorno;
        }

        private IEnumerable<BussinessLayerEntryException>  ValidaInscricao(Endereco endereco)
        {
            return ValidaExistencia(endereco);
        }

        private IEnumerable<BussinessLayerEntryException> ValidaExistencia(Endereco endereco)
        {
            var bussinessLayerEntryExceptions = new List<BussinessLayerEntryException>();


            return bussinessLayerEntryExceptions;
        }

        #endregion
        #endregion

    }
}